package com.example.common.utils;

/**
 * @author qwert
 * @version 1.0.0
 * @create 2025/7/7 22:07
 **/
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 自定义向量计算工具类
 */
@Component
public class VectorUtils {

    @Autowired
    private OpenAiEmbeddingModel embeddingModel;

    /**
     * 将文本转换为向量
     * @param text 输入文本
     * @return 向量数组
     */
    public float[] textToVector(String text) {
        return embeddingModel.embed(text);
    }


    /**
     * 计算欧式距离
     * @param v1 向量1
     * @param v2 向量2
     * @return 欧式距离
     */
    public static double euclideanDistance(float[] v1, float[] v2) {
        double sum = 0.0;
        for (int i = 0; i < v1.length; i++) {
            double diff = v1[i] - v2[i];
            sum += diff * diff;
        }
        return Math.sqrt(sum);
    }
    /**
     * 计算两个向量的余弦相似度
     * @param v1 向量1
     * @param v2 向量2
     * @return 相似度（0~1）
     */
    public static double cosineSimilarity(float[] v1, float[] v2) {
        double dotProduct = 0.0;
        double normA = 0.0;
        double normB = 0.0;
        for (int i = 0; i < v1.length; i++) {
            dotProduct += v1[i] * v2[i];
            normA += Math.pow(v1[i], 2);
            normB += Math.pow(v2[i], 2);
        }
        return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
    }

    /**
     * 存储向量到向量数据库（需集成 VectorStore 实现）
     * @param vector 向量
     * @param id 标识符
     */
    // public void storeVector(float[] vector, String id) { ... } // 结合 Milvus 或 H2 实现 [[7]]
}
